﻿'勇芳鼠标精灵脚本解释执行模块，解释脚本并且执行。
'注意：字符变量全部是 UTF8 编码，包括后面执行函数的字符串参数，都是  UTF8 编码
'      鼠标位置：x y 是相对与目标窗口客户区的位置。自动响应系统DPI，数值是 100%DPI时的数值。

Type 脚本配置类
   '设置-----------------
   执行次数 As Long   '脚本执行次数，=0为无限循环，直到按下停止键。
   执行速度 As Single '=0或=1 就按照原速度执行。此速度是倍数 >1越快，<1的小数越慢，不可以是负数
   前台模式 As Long   '=0后台模式 =1前台模式  后台时自己可以使用电脑，前台时鼠标被精灵控制，无法使用电脑
   点击效果 As Long = 1 '=0不显示 =1显示 ，显示为点击后的圈圈，使用户知道点击了什么地方。
   虚拟鼠标 As Long = 1 '=0不显示 =1显示 ，显示虚拟鼠标的指针来指示鼠标精灵在操作什么，前台模式和移动鼠标时因为有真实鼠标，虚拟鼠标就不显示了。
   开始位置 As Long = 1 '=0不移动 =1移动 ，先移动鼠标指针到开始位置，然后开始执行脚本。
   移动鼠标 As Long = 1 '=0不移动 =1移动 ，当前台模式时，是不是把真实鼠标指针移动到点击的位置。
   随机偏移 As Long '0-999 虚拟鼠标会在这个范围内随机偏移点击，避免游戏检查固定点击。
   '执行------------------------------
   虚拟指针 As hWnd  '显示虚拟指针的窗口句柄
   目标窗口 As hWnd  '要操作的目标窗口句柄，可以是某窗口里的子窗口。
   停止执行 As Long  '收到退出执行命令
   等待时间 As ULong '为上次执行脚本需要延迟时间，用来显示虚拟鼠标指针移动位置
   回放次数 As Long '当前第几次执行
   回放位置 As Long '在第几行中
End Type
Dim Shared 配置          As 脚本配置类

Function 目标窗口(窗口名 As CWSTR ,窗口类名 As CWSTR ,子级 As String) As Long '窗口为主窗口，然后子级为其内部第几个控件，=0为主窗口，若多级，用英文“,”号分开。成功返回0 ，失败非0
   Dim aa   As CWSTR = 窗口名
   Dim bb   As CWSTR = 窗口类名
   Dim cc() As String
   If Len(子级) Then vbSplit(子级 ,"," ,cc()) Else ReDim cc(0)
   配置.目标窗口 = 0
   Dim ee As hWnd = FindWindowW(bb ,aa)
   If ee = 0 Then 
      For i As Long =1 To 20  '预防点击弹出窗口，而没来得及显示出来
         Sleep 10
         ee = FindWindowW(bb ,aa)
         If ee Then Exit For 
      Next 
   End If   
   If ee = 0 Then
      aa = StringToCWSTR("找不到目标窗口，请检查目标软件是否开启。" & vbCrLf & "窗口名：") & aa
      aa &= StringToCWSTR(vbCrLf & "类名：") & bb
      配置.停止执行 = 1
      MessageBoxW(0 ,aa ,"执行脚本中发生错误" ,MB_OK Or MB_ICONERROR Or MB_DEFBUTTON1 Or MB_APPLMODAL Or MB_SETFOREGROUND Or MB_TOPMOST)
      
      Return 1
   End If
   Sleep 10  '延迟一下是必要的，不然可能新创建的窗口，还未创建出控件
   Dim i As Long ,ii As Long ,ccu As Long
   For i = 0 To UBound(cc)
      If 配置.停止执行 Then Return 99
      ccu = ValInt(cc(i))
      If ccu < 1   Then Exit For '无子级 就退出
      If ccu > 999 Then ccu = 999 '预防子级太多发生死循环
      For ii = 1 To ccu
         ee = GetWindow(ee ,IIf(ii = 1 ,GW_CHILD ,GW_HWNDNEXT))
         If ee = 0 Then
            aa = StringToCWSTR("找不到目标窗口中子级。" & vbCrLf & "窗口名：") & aa
            aa &= StringToCWSTR(vbCrLf & "类名：")                             & bb
            aa &= StringToCWSTR(vbCrLf & "子级：")                             & 子级
            aa &= StringToCWSTR(vbCrLf & "错误位于子级：")                     & i
            MessageBoxW(0 ,aa ,"执行脚本中发生错误" ,MB_OK Or MB_ICONERROR Or MB_DEFBUTTON1 Or MB_APPLMODAL Or MB_SETFOREGROUND Or MB_TOPMOST)
            配置.停止执行 = 1
            Return 2
         End If
      Next
   Next
   配置.目标窗口 = ee
   Function      = 0
End Function

Function 鼠标点击(按键 As Long ,位置x As Long ,位置y As Long ,次数 As Long ,等待时间 As ULong) As Long '等待时间是毫秒为单位，成功返回0 ，失败非0
   Dim i As Long ,tt As ULong
   i = 通用预先处理(等待时间 - 次数*2 ,位置x ,位置y) '次数消耗了时间，因此减少
   If i Then Return i
   Dim As Long x ,y ,tx ,ty ,gx ,gy
   Dim po As Point
   Dim rc As Rect
   GetClientRect(配置.目标窗口 ,@rc)
   MapWindowPoints 配置.目标窗口 ,HWND_DESKTOP ,Cast(LPPOINT ,Varptr(rc)) ,2
   tx = rc.Left '目标窗口位置
   ty = rc.top
   Randomize
   
   For i = 1 To 次数
      x = AfxScaleX(位置x) + tx
      y = AfxScaleY(位置y) + ty
      If 配置.随机偏移 <> 0 Then
         Dim k As Single = 配置.随机偏移 / 2
         x += Rnd_Range( - k ,k)
         y += Rnd_Range( - k ,k)
      End If
      po.x = x
      po.y = y
      If 配置.前台模式 Then
         Dim pp(1) As INPUT_
         pp(0).Type  = INPUT_MOUSE
         pp(1).Type  = INPUT_MOUSE
         pp(0).mi.dx = x
         pp(0).mi.dy = y
         pp(1).mi.dx = x
         pp(1).mi.dy = y
         GetCursorPos @po
         If 配置.移动鼠标 <> 0 Then SetCursorPos x ,y
         'pp.mi.mouseData = 0
         Select Case 按键
            Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
               If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,WM_LBUTTONDOWN
               pp(0).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_LEFTDOWN
               pp(1).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_LEFTUP
            Case 2 '按下鼠标右键
               If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,WM_RBUTTONDOWN
               pp(0).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_RIGHTDOWN
               pp(1).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_RIGHTUP
            Case 3 '按下鼠标中键
               If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,519
               pp(0).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_MIDDLEDOWN
               pp(1).mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_MIDDLEUP
         End Select
         SendInput 2 ,@pp(0) ,SizeOf(INPUT_)
         If 配置.移动鼠标 <> 0 Then SetCursorPos po.x ,po.y
      Else
         Select Case 按键
            Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
               tt = WM_LBUTTONDOWN
            Case 2 '按下鼠标右键
               tt = WM_RBUTTONDOWN
            Case 3 '按下鼠标中键
               tt = 519
         End Select
         If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,tt
         If PtInRect(@rc ,po)  Then '必须在窗口内部
            x -= tx
            y -= ty
            BackMmouseClick(配置.目标窗口 ,x ,y ,按键)
         Else
            Dim xy As lParam = MAKELPARAM(x ,y)
            Dim nn As wParam = SendMessage(配置.目标窗口 ,WM_NCHITTEST ,0 ,xy) '默认为 SendMessageW
            Select Case 按键
               Case 1 '左键
                  PostMessage 配置.目标窗口 ,WM_NCLBUTTONDOWN ,nn ,xy
                  PostMessage 配置.目标窗口 ,WM_NCLBUTTONUP   ,nn ,xy
               Case 2 '右键
                  PostMessage 配置.目标窗口 ,WM_NCRBUTTONDOWN ,nn ,xy
                  PostMessage 配置.目标窗口 ,WM_NCRBUTTONUP   ,nn ,xy
               Case 3 '中键
                  PostMessage 配置.目标窗口 ,WM_NCMBUTTONDOWN ,nn ,xy
                  PostMessage 配置.目标窗口 ,WM_NCMBUTTONUP   ,nn ,xy
            End Select
         End If
      End If
      'tt = GetTickCount '间隔毫秒
      'Do
      '   If 配置.停止执行                Then Return 99
      '   If GetTickCount - tt > 间隔毫秒 Then Exit Do
      '   Sleep 10
      'Loop
      If 配置.停止执行 Then Return 99
      Sleep 1
   Next
End Function

Function 鼠标拖移(按键 As Long ,开始x As Long ,开始y As Long ,结束x As Long ,结束y As Long ,经历时间 As ULong ,等待时间 As ULong) As Long '等待时间是毫秒为单位，成功返回0 ，失败非0
   Dim i As Long ,tt As ULong
   i = 通用预先处理(等待时间 ,开始x ,开始y)
   If i Then Return i
   Dim As Long x ,y ,tx ,ty ,gx ,gy
   Dim po As Point
   Dim rc As Rect ,gtc As ULong ,bl As Single ,nw As Long
   '拖动操作 ======================================
   '按下----------------
   GetWindowRect(配置.虚拟指针 ,@rc)
   gx = rc.Left '虚拟鼠标当前位置
   gy = rc.top
   GetClientRect(配置.目标窗口 ,@rc)
   MapWindowPoints 配置.目标窗口 ,HWND_DESKTOP ,Cast(LPPOINT ,Varptr(rc)) ,2
   tx = rc.Left '目标窗口位置
   ty = rc.top
   x  = AfxScaleX(开始x) + tx '桌面鼠标指针位置
   y  = AfxScaleY(开始y) + ty
   If 配置.前台模式 Then
      Dim pp As INPUT_
      pp.Type  = INPUT_MOUSE
      pp.mi.dx = x
      pp.mi.dy = y
      SetCursorPos x ,y
      'pp.mi.mouseData = 0
      Select Case 按键
         Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
            If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,WM_LBUTTONDOWN
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_LEFTDOWN
            SendInput 1 ,@pp ,SizeOf(INPUT_)
         Case 2 '按下鼠标右键
            If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,WM_RBUTTONDOWN
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_RIGHTDOWN
            SendInput 1 ,@pp ,SizeOf(INPUT_)
         Case 3 '按下鼠标中键
            If 配置.点击效果 <> 0 Then F4_启动点击效果 x ,y ,519
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_MIDDLEDOWN
            SendInput 1 ,@pp ,SizeOf(INPUT_)
      End Select
   Else
      Select Case 按键
         Case 1 '按下鼠标左键            Case
            tt = WM_LBUTTONDOWN
         Case 2 '按下鼠标右键
            tt = WM_RBUTTONDOWN
         Case 3 '按下鼠标中键
            tt = WM_MBUTTONDOWN
         Case Else
            tt = 0
      End Select
      If 配置.点击效果 <> 0 And tt <> 0 Then F4_启动点击效果 x ,y ,tt
      po.x = x
      po.y = y
      If PtInRect(@rc ,po) Then '必须在窗口内部
         x -= tx
         y -= ty
         Select Case 按键
            Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
               PostMessage 配置.目标窗口 ,WM_LBUTTONDOWN ,MK_LBUTTON ,MAKELPARAM(x ,y)
            Case 2 '按下鼠标右键
               PostMessage 配置.目标窗口 ,WM_RBUTTONDOWN ,MK_RBUTTON ,MAKELPARAM(x ,y)
            Case 3 '按下鼠标中键
               PostMessage 配置.目标窗口 ,WM_MBUTTONDOWN ,MK_MBUTTON ,MAKELPARAM(x ,y)
         End Select
      Else
         nw = 1
         Dim xy As lParam = MAKELPARAM(x ,y)
         Dim nn As wParam = SendMessage(配置.目标窗口 ,WM_NCHITTEST ,0 ,xy) '默认为 SendMessageW
         Select Case 按键
            Case 1 '左键
               PostMessage 配置.目标窗口 ,WM_NCLBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCLBUTTONUP   ,nn ,xy
            Case 2 '右键
               PostMessage 配置.目标窗口 ,WM_NCRBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCRBUTTONUP   ,nn ,xy
            Case 3 '中键
               PostMessage 配置.目标窗口 ,WM_NCMBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCMBUTTONUP   ,nn ,xy
         End Select
      End If
      
   End If
   '拖动-------------------------
   If 配置.虚拟鼠标 <> 0 And 配置.前台模式 = 0 Then
      If IsWindow(配置.目标窗口) = 0 Then FF_Control_ShowState(配置.目标窗口 ,SW_SHOWNA)
   Else
      If IsWindow(配置.目标窗口) Then FF_Control_ShowState(配置.目标窗口 ,SW_HIDE)
   End If
   
   x = AfxScaleX(结束x) + tx '桌面鼠标指针位置
   y = AfxScaleY(结束y) + ty
   If 配置.执行速度 = 0 Then 配置.执行速度 = 1
   If 经历时间 <= 0 Then
      i = 0
   Else
      i = 经历时间 / 配置.执行速度
   End If   
   tt = GetTickCount + i '间隔毫秒
   Do
      If 配置.停止执行 Then Return 99
      gtc = GetTickCount
      If gtc > tt Then Exit Do
      bl = (tt - gtc) / 10 '时间比例
      If bl <= 0 Then
         Exit Do
      Else
         gx += (x - gx) / bl '算出每次移动后的位置
         gy += (y - gy) / bl
      End If
      SetWindowPos(配置.虚拟指针 ,HWND_TOPMOST ,gx + 1 ,gy + 1 ,0 ,0 ,SWP_NOSIZE Or SWP_NOACTIVATE)
      If 配置.前台模式 <> 0 Then
         SetCursorPos gx ,gy
      Else
         BackMoveMouse(配置.目标窗口 ,gx - tx ,gy - ty)
      End If
      Sleep 10
   Loop
   gx = x : gy = y
   SetWindowPos(配置.虚拟指针 ,HWND_TOPMOST ,gx + 1 ,gy + 1 ,0 ,0 ,SWP_NOSIZE Or SWP_NOACTIVATE)
   If 配置.前台模式 <> 0 And 配置.移动鼠标 <> 0 Then
      SetCursorPos gx ,gy
   Else
      BackMoveMouse(配置.目标窗口 ,gx - tx ,gy - ty)
   End If
   '释放---------------------------------
   x = AfxScaleX(结束x) + tx '桌面鼠标指针位置
   y = AfxScaleY(结束y) + ty
   If 配置.前台模式 Then
      Dim pp As INPUT_
      pp.Type  = INPUT_MOUSE
      pp.mi.dx = x
      pp.mi.dy = y
      SetCursorPos x ,y
      'pp.mi.mouseData = 0
      Select Case 按键
         Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_LEFTUP
            SendInput 1 ,@pp ,SizeOf(INPUT_)
         Case 2 '按下鼠标右键
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_RIGHTUP
            SendInput 1 ,@pp ,SizeOf(INPUT_)
         Case 3 '按下鼠标中键
            pp.mi.dwFlags = MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_VIRTUALDESK Or MOUSEEVENTF_MIDDLEUP
            SendInput 1 ,@pp ,SizeOf(INPUT_)
      End Select
   Else
      If nw = 0 Then '必须在窗口内部
         x -= tx
         y -= ty
         Select Case 按键
            Case 1 '按下鼠标左键            Case WM_LBUTTONDOWN
               PostMessage 配置.目标窗口 ,WM_LBUTTONUP ,MK_LBUTTON ,MAKELPARAM(x ,y)
            Case 2 '按下鼠标右键
               PostMessage 配置.目标窗口 ,WM_RBUTTONUP ,MK_RBUTTON ,MAKELPARAM(x ,y)
            Case 3 '按下鼠标中键
               PostMessage 配置.目标窗口 ,WM_MBUTTONUP ,MK_MBUTTON ,MAKELPARAM(x ,y)
         End Select
      Else
         Dim xy As lParam = MAKELPARAM(x ,y)
         Dim nn As wParam = SendMessage(配置.目标窗口 ,WM_NCHITTEST ,0 ,xy) '默认为 SendMessageW
         Select Case 按键
            Case 1 '左键
               PostMessage 配置.目标窗口 ,WM_NCLBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCLBUTTONUP   ,nn ,xy
            Case 2 '右键
               PostMessage 配置.目标窗口 ,WM_NCRBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCRBUTTONUP   ,nn ,xy
            Case 3 '中键
               PostMessage 配置.目标窗口 ,WM_NCMBUTTONDOWN ,nn ,xy
               PostMessage 配置.目标窗口 ,WM_NCMBUTTONUP   ,nn ,xy
         End Select
      End If
   End If
End Function
Function 鼠标滚轮(滚动值 As Long ,位置x As Long ,位置y As Long ,次数 As Long ,等待时间 As ULong) As Long '等待时间是毫秒为单位，成功返回0 ，失败非0
   Dim i As Long ,tt As ULong
   i = 通用预先处理(等待时间 - 次数*2 ,位置x ,位置y) '次数消耗了时间，因此减少
   If i Then Return i
   Dim As Long x ,y ,tx ,ty ,gx ,gy
   Dim po As Point
   Dim rc As Rect ,gtc As ULong ,bl As Single
   '滚轮操作 ======================================
   
   GetClientRect(配置.目标窗口 ,@rc)
   MapWindowPoints 配置.目标窗口 ,HWND_DESKTOP ,Cast(LPPOINT ,Varptr(rc)) ,2
   tx = rc.Left '目标窗口位置
   ty = rc.top
   
   For i = 1 To 次数
      x    = AfxScaleX(位置x) + tx
      y    = AfxScaleY(位置y) + ty
      po.x = x
      po.y = y
      If 配置.前台模式 Then
         Dim pp As INPUT_
         pp.Type         = INPUT_MOUSE
         pp.mi.dx        = x
         pp.mi.dy        = y
         pp.mi.mouseData = 滚动值
         SendInput 1 ,@pp ,SizeOf(INPUT_)
      Else
         x -= tx
         y -= ty
         PostMessage 配置.目标窗口 ,WM_MOUSEWHEEL ,MAKEWPARAM(0 ,滚动值) ,MAKELPARAM(x ,y)
      End If
      If 配置.停止执行 Then Return 99
      Sleep 1
   Next
End Function

Function 通用预先处理(等待时间 As ULong ,位置x As Long ,位置y As Long) As Long '成功返回0 ，失败非0
   If 配置.停止执行 Then Return 99
   If IsWindow(配置.目标窗口) = 0 Then
      MessageBoxW(0 ,"没有目标窗口，先执行“目标窗口”命令。" ,"执行脚本中发生错误" ,MB_OK Or MB_ICONERROR Or MB_DEFBUTTON1 Or MB_APPLMODAL Or MB_SETFOREGROUND Or MB_TOPMOST)
      配置.停止执行 = 1
      Return 1   
   End If 
   If IsWindow(配置.目标窗口) = 0 Then
      MessageBoxW(0 ,"目标窗口已经关闭，无法继续执行脚本。" ,"执行脚本中发生错误" ,MB_OK Or MB_ICONERROR Or MB_DEFBUTTON1 Or MB_APPLMODAL Or MB_SETFOREGROUND Or MB_TOPMOST)
      配置.停止执行 = 1
      Return 1
   End If
   Dim tt As ULong
   Dim As Long i ,x ,y ,tx ,ty ,gx ,gy
   
   If 配置.虚拟鼠标 <> 0 And 配置.前台模式 = 0 Then
      If IsWindow(配置.虚拟指针) = 0 Then FF_Control_ShowState(配置.虚拟指针 ,SW_SHOWNA)
   Else
      If IsWindow(配置.虚拟指针) Then FF_Control_ShowState(配置.虚拟指针 ,SW_HIDE)
   End If
   '模拟鼠标移动 --------------------
   Dim rc As Rect ,gtc As ULong ,bl As Single
   GetClientRect(配置.目标窗口 ,@rc)
   MapWindowPoints 配置.目标窗口 ,HWND_DESKTOP ,Cast(LPPOINT ,Varptr(rc)) ,2
   tx = rc.Left '目标窗口位置
   ty = rc.top
   x  = AfxScaleX(位置x) + tx '桌面鼠标指针位置
   y  = AfxScaleY(位置y) + ty
   
   If 配置.执行速度 = 0 Then 配置.执行速度 = 1
   If 配置.等待时间 <= 0 Then
      i = 1000
   Else
      i = 配置.等待时间 / 配置.执行速度
   End If
   tt = GetTickCount + i '间隔毫秒
   
   GetWindowRect(配置.虚拟指针 ,@rc)
   gx = rc.Left '虚拟鼠标当前位置
   gy = rc.top
   
   Do
      If 配置.停止执行 Then Return 99
      gtc = GetTickCount
      If gtc > tt Then Exit Do
      
      bl = (tt - gtc) / 10 '时间比例
      If bl <= 0 Then
         Exit Do
      Else
         gx += Int( (x - gx) / bl) '算出每次移动后的位置
         gy += Int( (y - gy) / bl )
      End If
      
      SetWindowPos(配置.虚拟指针 ,HWND_TOPMOST ,gx + 1 ,gy + 1 ,0 ,0 ,SWP_NOSIZE Or SWP_NOACTIVATE)
      If 配置.前台模式 <> 0 And 配置.移动鼠标 <> 0 Then
         SetCursorPos gx ,gy
      Else
         BackMoveMouse(配置.目标窗口 ,gx - tx ,gy - ty)
      End If
      
      Sleep 10
   Loop
   gx = x : gy = y
   SetWindowPos(配置.虚拟指针 ,HWND_TOPMOST ,gx + 1 ,gy + 1 ,0 ,0 ,SWP_NOSIZE Or SWP_NOACTIVATE)
   If 配置.前台模式 <> 0 And 配置.移动鼠标 <> 0 Then
      SetCursorPos gx ,gy
   Else
      BackMoveMouse(配置.目标窗口 ,gx - tx ,gy - ty)
   End If
   
   'PrintA bl ,gx ,gy ,x ,y
   配置.等待时间 = 等待时间 '给下次点击时，模拟移动鼠标用
End Function






















